package visitor;

import syntaxtree.*;

//Alguns metodos dessa classe sao vazios pois sao usados somente pelo
//PretyyPrintVisitor.java   

public class DepthFirstVisitor implements Visitor {       
    
    @Override
    public void visit(This n) {
    }

    @Override
    public void visit(False n) {
    }
    
    @Override
    public void visit(Identifier n) {
    }
    
    @Override
    public void visit(IntArrayType n) {
    }

    @Override
    public void visit(BooleanType n) {
    }

    @Override
    public void visit(IntegerType n) {
    }

    @Override
    public void visit(IdentifierType n) {
    }
    
    @Override
    public void visit(NewObject n) {
    }

     @Override
    public void visit(IdentifierExp n) {
    }
    
    @Override
    public void visit(Minus n) {
        n.e1.accept(this);
        n.e2.accept(this);
    }

    @Override
    public void visit(Times n) {
        n.e1.accept(this);
        n.e2.accept(this);
    }

    @Override
    public void visit(ArrayLookup n) {
        n.e1.accept(this);
        n.e2.accept(this);
    }
    
    @Override
    public void visit(Program prog) {
        prog.m.accept(this);
        for (int i = 0; i < prog.cl.size(); i++)
            prog.cl.elementAt(i).accept(this);
    }

    @Override
    public void visit(MainClass cds) {
        cds.i1.accept(this);
        cds.i2.accept(this);
        cds.s.accept(this);
    }

    @Override
    public void visit(ClassDeclSimple n) {
        n.i.accept(this);
        for (int i = 0; i < n.vl.size(); i++)
            n.vl.elementAt(i).accept(this);
        for (int i = 0; i < n.ml.size(); i++)
            n.ml.elementAt(i).accept(this);
    }

    @Override
    public void visit(ClassDeclExtends cde) {
        cde.i.accept(this);
        cde.j.accept(this);
        for (int i = 0; i < cde.vdl.size(); i++)
            cde.vdl.elementAt(i).accept(this);

        for (int i = 0; i < cde.mdl.size(); i++)
            cde.mdl.elementAt(i).accept(this);

    }

    @Override
    public void visit(VarDecl vd) {
        vd.t.accept(this);
        vd.i.accept(this);
    }

    @Override
    public void visit(MethodDecl md) {
        md.t.accept(this);
        md.i.accept(this);
        for (int i = 0; i < md.fl.size(); i++)
            md.fl.elementAt(i).accept(this);

        for (int i = 0; i < md.vl.size(); i++)
            md.vl.elementAt(i).accept(this);

        for (int i = 0; i < md.sl.size(); i++)
            md.sl.elementAt(i).accept(this);

        md.e.accept(this);
    }

    @Override
    public void visit(Formal f) {
        f.t.accept(this);
        f.i.accept(this);
    }

    @Override
    public void visit(Block w) {
        for (int i = 0; i < w.sl.size(); i++)
            w.sl.elementAt(i).accept(this);
    }

    @Override
    public void visit(If n) {
        n.e.accept(this);
        n.s1.accept(this);
        n.s2.accept(this);
    }

    @Override
    public void visit(While w) {
        w.e.accept(this);
        w.s.accept(this);
    }

    @Override
    public void visit(Print p) {
        p.e.accept(this);
    }
    
    @Override
    public void visit(Assign n) {
        n.i.accept(this);
        n.e.accept(this);
    }

    @Override
    public void visit(ArrayAssign n) {
        n.i.accept(this);
        n.e1.accept(this);
        n.e2.accept(this);
    }   
    

    @Override
    public void visit(ArrayLength n) {
        n.e.accept(this);
    }

    @Override
    public void visit(Call n) {
        n.e.accept(this);
        n.i.accept(this);
        for (int i = 0; i < n.el.size(); i++)
            n.el.elementAt(i).accept(this);
    }

    @Override
    public void visit(NewArray n) {
        n.e.accept(this);
    }

    @Override
    public void visit(IntegerLiteral n) {
    }

    @Override
    public void visit(Not n) {
        n.e.accept(this);
    }   

    @Override
    public void visit(True n) {
    }

    @Override
    public void visit(And n) {
        n.e1.accept(this);
        n.e2.accept(this);
    }

    @Override
    public void visit(LessThan n) {
        n.e1.accept(this);
        n.e2.accept(this);
    }

    @Override
    public void visit(Plus n) {
        n.e1.accept(this);
        n.e2.accept(this);
    }
   
}
